package com.wmuj.utils;

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import java.io.ByteArrayInputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class AliyunOSSOperator {
  /**
   * 方式一通过value注解 太繁琐
   *
   * <p>// @Value("${aliyun.oss.endpoint}") // private String endpoint; //
   * // @Value("${aliyun.oss.bucketName}") // private String bucketName; //
   * // @Value("${aliyun.oss.region}") private String region;
   */
  @Autowired private AliyunOSSProperties aliyunOSSProperties;

  public String upload(byte[] content, String originalFilename) throws Exception {
    String endpoint = aliyunOSSProperties.getEndpoint();
    String bucketName = aliyunOSSProperties.getBucketName();
    String region = aliyunOSSProperties.getRegion();
    // 从环境变量中获取访问凭证。运行本代码示例之前，请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    EnvironmentVariableCredentialsProvider credentialsProvider =
        CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

    // 填写Object完整路径，例如202406/1.png。Object完整路径中不能包含Bucket名称。
    // 获取当前系统日期的字符串,格式为 yyyy/MM
    String dir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM"));
    // 生成一个新的不重复的文件名
    String newFileName =
        UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
    String objectName = dir + "/" + newFileName;

    // 创建OSSClient实例。
    ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
    clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
    OSS ossClient =
        OSSClientBuilder.create()
            .endpoint(endpoint)
            .credentialsProvider(credentialsProvider)
            .clientConfiguration(clientBuilderConfiguration)
            .region(region)
            .build();

    try {
      ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content));
    } finally {
      ossClient.shutdown();
    }

    return endpoint.split("//")[0]
        + "//"
        + bucketName
        + "."
        + endpoint.split("//")[1]
        + "/"
        + objectName;
  }
}
